home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 22 / Cream of the Crop 22.iso / program / inter52g.zip / RB2NG116.ZIP / RB2NG.PAS < prev   
Pascal/Delphi Source File  |  1995-07-22  |  29KB  |  1,106 lines

  1. {
  2.  
  3. Converts Ralf Brown's Interrupt List to .NG Compilable Source Files
  4.  
  5. Version 1.13
  6.  
  7. (c) Copyright 1995, Michael Gallias
  8.  
  9. Target: Real
  10.  
  11. }
  12.  
  13.  
  14. Program RBNG;
  15.  
  16. {$F-} {$O-} {$A+} {$G-}
  17. {$V-} {$B-} {$X-} {$N+} {$E+}
  18.  
  19. {$M 8192,0,0}
  20.  
  21. Uses PasStr,CRT;
  22.  
  23. Type
  24.   ConvertType = Array [1..100] of
  25.                 Record
  26.                   IfThis  :String[10];
  27.                   ThenThis:String[10];
  28.                 End;
  29.  
  30. Var
  31.   BatchJob,
  32.   MenuLink,
  33.   F,G          :Text;
  34.   L            :String;
  35.   SeeAlsoLine  :String;
  36.  
  37.   IntFiles     :Array[0..255] of String[12];
  38.  
  39. Procedure Pad(Total,WithChar:Byte);
  40.  
  41. Begin
  42.   For Total:=1 to Total do      {As many times as requested}
  43.       Write(Chr(WithChar));     {write the char}
  44. End;  {Pad}
  45.  
  46. Procedure EditString(X,Y,MaxLets:Byte;Upper:Boolean;Var MainStr:String);
  47.  
  48. Var
  49.   Ins             :Boolean;   {Boolean for the Insert Key Status}
  50.   C               :Char;      {Current Character}
  51.   CurXPos,
  52.   Count           :Byte;      {Number Of Chars In String}
  53.  
  54. Begin
  55.   Ins:=False;                {The Insert key has not yet been pressed}
  56.   CurXPos:=1;                {Current Relative X Position+1}
  57.   GotoXY(X,Y);
  58.   UnPadVar(MainStr,MainStr);
  59.   If Length(MainStr)>MaxLets Then
  60.     MainStr:=Copy(MainStr,1,MaxLets);
  61.   Write(MainStr);
  62.   Pad(MaxLets-Length(MainStr),32);
  63.   Count:=Length(MainStr)+1;  {How many letters in the string+1}
  64.  
  65.   Repeat                     {Repeat Until [Return] is Pressed}
  66.     GotoXY(X+CurXPos-1,Y);   {Goto the Requested Area}
  67.     If Upper Then
  68.       C:=UpCase(ReadKey)
  69.     Else
  70.       C:=ReadKey;
  71.  
  72.     If C=Chr(0) Then         {Check for a cursor key}
  73.     Begin
  74.       C:=ReadKey;            {Which cursor key}         {Numeric Keypad Value}
  75.       If (C='O') Then CurXPos:=Count;                            {1}
  76.       If (C='P') And (CurXPos>=3) Then Dec(CurXPos,2);           {2}
  77.       If (C='Q') And (CurXPos>=4) Then Dec(CurXPos,3);           {3}
  78.       If (C='K') And (CurXPos>1) Then Dec(CurXPos);              {4}
  79.       If (C='M') And (CurXPos<Count) Then Inc(CurXPos);          {6}
  80.       If (C='G') Then CurXPos:=1;                                {7}
  81.       If (C='H') And (CurXPos<=Count-2) Then Inc(CurXPos,2);     {8}
  82.       If (C='I') And (CurXPos<=Count-3) Then Inc(CurXPos,3);     {9}
  83.       If (C=#7 ) Then MainStr[0]:=Chr(CurXPos-1);                {Shift-Del}
  84.       If (C='S') And (Count>1) Then                              {Del}
  85.       Begin
  86.         Delete(MainStr,CurXPos,1);
  87.         GotoXY(X,Y);
  88.         Write(MainStr,' ');
  89.         Dec(Count);
  90.         GotoXY(X-1+CurXPos,Y);
  91.       End;
  92.       If (C='R') Then                                            {Ins}
  93.       Begin
  94.         Ins:=Not Ins;
  95.       End;
  96.       GotoXY(X-1+CurXPos,Y);
  97.     End  {End Extended Key}
  98.     Else
  99.     Begin
  100.  
  101.       If (C=#17) Then                           {^Q}
  102.       Begin
  103.         C:=ReadKey;
  104.         If C=#0 Then
  105.           C:=ReadKey
  106.         Else
  107.         If C in ['y','Y',#25] Then
  108.         Begin
  109.           MainStr[0]:=Chr(CurXPos-1);
  110.           Count:=CurXPos;
  111.           GotoXY(X,Y);
  112.           Write(MainStr);
  113.           Pad(MaxLets-Length(MainStr),32);
  114.         End;
  115.       End
  116.       Else
  117.       If (C=#27) Then
  118.       Begin
  119.         GotoXY(X,Y);
  120.         Pad(MaxLets,32);
  121.         MainStr:='';
  122.         C:=#13;
  123.       End
  124.       Else
  125.       If (C=#8) Then                     {Was BackSpace Presssed?}
  126.       Begin
  127.         If (CurXPos>1) Then              {Can I BackSpace?}
  128.         Begin
  129.           Delete(MainStr,CurXPos-1,1);   {Delete the char}
  130.           GotoXY(X,Y);
  131.           Write(MainStr,' ');            {Redisplay the String}
  132.           Dec(Count);                    {One less char}
  133.           Dec(CurXPos);                  {Move Back}
  134.           GotoXY(X-1+CurXPos,Y);         {Goto Position}
  135.         End;                             {End 'Can I BackSpace?'}
  136.       End                                {End 'Was BackSpace Pressed?'}
  137.       Else                               {No Not BackSpace - A Normal Letter}
  138.         If (CurXPos<=MaxLets) And (C<>#13) Then    {Is there Space?}
  139.         Begin
  140.           If Ins Or (CurXPos>=Count) Then   {Must I Insert the Char?}
  141.           Begin
  142.             If Count<=MaxLets Then
  143.               Begin
  144.                 Insert(C,MainStr,CurXPos);  {Insert the Char}
  145.                 Inc(Count);                 {Add 1 to Count}
  146.                 Inc(CurXPos);               {Move Cursor}
  147.               End;                          {End Check for Space in String}
  148.           End                               {End Check to see if Ins was True}
  149.           Else                              {No, Do not Insert, Overwrite}
  150.           Begin
  151.             MainStr[CurXPos]:=C;      {Overwrite char}
  152.             Inc(CurXPos);             {Move Cursor}
  153.           End;                        {End Insert / Overwrite}
  154.  
  155.           If CurXPos<Count Then       {If the char was Inserted, Rewrite}
  156.           Begin                       {the entire String to the screen}
  157.             GotoXY(X,Y);
  158.             Write(MainStr);
  159.             GotoXY(X-1+CurXPos,Y);
  160.           End                         {End Rewrite the String to the screen}
  161.           Else                        {Need Not Rewrite the entire String}
  162.              Write(C);                {Just Display the new char}
  163.         End;
  164.     End;                              {End Area which accepts a BackSpace or a Letter}
  165.   Until C=#13;
  166. End;
  167.  
  168. Function HexToDec(Hex:String):Word;
  169.  
  170. Var
  171.   Temp  :Word;
  172.  
  173. Begin
  174.   Temp:=0;
  175.   UpperCase(Hex,Hex);
  176.   If Hex[1] in ['0'..'9'] Then Temp:=Temp + (Ord(Hex[1])-Ord('0'))*16;
  177.   If Hex[1] in ['A'..'F'] Then Temp:=Temp + (Ord(Hex[1])-Ord('A')+10)*16;
  178.   If Hex[2] in ['0'..'9'] Then Temp:=Temp +  Ord(Hex[2])-Ord('0');
  179.   If Hex[2] in ['A'..'F'] Then Temp:=Temp +  Ord(Hex[2])-Ord('A')+10;
  180.   HexToDec:=Temp;
  181. End;
  182.  
  183. Procedure CheckIntNumber(Var L:String;Var NewNumber:Boolean;
  184.                          Var IntComment:String;Var IntCount:Word);
  185.  
  186. Const
  187.   LastInt :Word = 65000;
  188.  
  189. Var
  190.   DecStr  :String[4];
  191.   DecNum  :Word;
  192.  
  193. Begin
  194.   NewNumber:=False;
  195.   IntComment:='';
  196.   If Copy(L,1,4)='Int ' Then
  197.   Begin
  198.     Inc(IntCount);
  199.     L[5]:=UpCase(L[5]);
  200.     L[6]:=UpCase(L[6]);
  201.     DecNum:=HexToDec(Copy(L,5,2));
  202.     If (DecNum<>LastInt) And (DecNum<=240) And ((DecNum>=16) Or (DecNum=0)) Then
  203.     Begin
  204.       IntCount:=1;
  205.       LastInt:=DecNum;
  206.       Str(DecNum:3,DecStr);
  207.       IntComment:='Interrupt '+Copy(L,5,2)+'h'+'  ('+DecStr+')';
  208.       If DecNum=240 Then IntComment:=IntComment+' ^Bto^B FFh  (255)';
  209.       If DecNum=  0 Then IntComment:=IntComment+' ^Bto^B 0Fh  ( 15)';
  210.       NewNumber:=True;
  211.     End;
  212.     If (DecNum>240) Or ((DecNum<16) And (DecNum<>0)) Then IntComment:='$$NO$$';
  213.   End;
  214.   If Copy(L,1,19)='Please Redistribute' Then
  215.   Begin
  216.     IntComment:='Final Comments From Ralf';
  217.     NewNumber:=True;
  218.   End;
  219. End;
  220.  
  221. Function NGOFName(FName:String):String;
  222. Begin
  223.   NGOFName:=Copy(FName,1,Pos('.',FName))+'NGO';
  224. End;
  225.  
  226. Procedure NewMenuItem(Comment,FName:String);
  227. Begin
  228.   WriteLn(MenuLink,'   '+Comment+'  '+NGOFName(FName));
  229. End;
  230.  
  231. Procedure NewBatchItem(Command:String);
  232. Begin
  233.   WriteLn(BatchJob,Command);
  234. End;
  235.  
  236. Function NextOutputFileName:String;
  237.  
  238. Const
  239.   Total   :Word = 0;
  240.  
  241. Var
  242.   Temp  :String[3];
  243.  
  244. Begin
  245.   Inc(Total);
  246.   Str(Total,Temp);
  247.   FormatVar(Temp,Temp,3,RightText);
  248.   SpacesToZeros(Temp,Temp);
  249.   NextOutputFileName:='RB'+Temp+'.';
  250. End;
  251.  
  252. Procedure I(Var S:String);
  253. Begin
  254.   ReadLn(F,S);
  255. End;
  256.  
  257. Procedure O(S:String);
  258. Begin
  259.   WriteLn(G,S);
  260. End;
  261.  
  262. Procedure OLn;
  263. Begin
  264.   WriteLn(G);
  265. End;
  266.  
  267. Procedure BoldEtc(StIn:String;Var StOut:String);
  268.  
  269. Var
  270.   SpPos:Byte;
  271.  
  272. Begin
  273.   StOut:=StIn;
  274.  
  275.   SpPos:=Pos('Desc:',StOut);
  276.   If SpPos>0 Then
  277.   Begin
  278.     Delete(StOut,SpPos,5);
  279.     Insert('^BDesc:^B',StOut,SpPos);
  280.   End;
  281.  
  282.   SpPos:=Pos('Note:',StOut);
  283.   If SpPos>0 Then
  284.   Begin
  285.     OLn;
  286.     Delete(StOut,SpPos,5);
  287.     Insert('^BNote:^B',StOut,SpPos);
  288.   End;
  289.  
  290.   SpPos:=Pos('SeeAlso:',StOut);
  291.   If SpPos>0 Then
  292.   Begin
  293.     OLn;
  294.     Delete(StOut,SpPos,8);
  295.     Insert('^BSee Also:^B',StOut,SpPos);
  296.   End;
  297.  
  298.   SpPos:=Pos('Return:',StOut);
  299.   If SpPos>0 Then
  300.   Begin
  301.     OLn;
  302.     Delete(StOut,SpPos,7);
  303.     Insert('^BReturn:^B',StOut,SpPos);
  304.   End;
  305.  
  306.   SpPos:=Pos('Notes:',StOut);
  307.   If SpPos>0 Then
  308.   Begin
  309.     OLn;
  310.     Delete(StOut,SpPos,6);
  311.     Insert('^BNotes:^B',StOut,SpPos);
  312.   End;
  313. End;
  314.  
  315. Procedure TabTo(StIn:String;Var StOut:String;TabSize:Byte);
  316.  
  317. Var
  318.   SpPos:Byte;
  319.   Spc  :String;
  320.  
  321. Begin
  322.   StOut:=StIn;
  323.  
  324.   Repeat
  325.     SpPos:=Pos(#9,StOut);
  326.     If SpPos>0 Then
  327.     Begin
  328.       Delete(StOut,SpPos,1);
  329.       PadVar('',Spc,TabSize - (SpPos Mod TabSize));
  330.       Insert(Spc,StOut,SpPos);
  331.     End;
  332.   Until SpPos=0;
  333. End;
  334.  
  335. Procedure LoadConvertList(FromFile:String;Var CList:ConvertType);
  336.  
  337. Var
  338.   F     :Text;
  339.   Cnt   :Word;
  340.   St    :String;
  341.   SpPos :Byte;
  342.  
  343. Begin
  344.   FillChar(CList,SizeOf(CList),0);
  345.   Cnt:=0;
  346.   Assign(F,FromFile);
  347.   Reset(F);
  348.   If IOResult>0 Then Exit;
  349.   While (Not EOF(F)) And (Cnt<99) do
  350.   Begin
  351.     Inc(Cnt);
  352.     ReadLn(F,St);
  353.     SpPos:=Pos('|',St);
  354.     If SpPos>0 Then
  355.     Begin
  356.       If SpPos>11 Then SpPos:=11;
  357.       CList[Cnt].IfThis:=Copy(St,1,SpPos-1);
  358.       Delete(St,1,SpPos);
  359.       CList[Cnt].ThenThis:=Copy(St,1,10);
  360.     End;
  361.   End;
  362.   Close(F);
  363. End;
  364.  
  365. Var
  366.   UserStyle2    :String[20];    {Sub & Fn}
  367.   UserStyle1    :String[20];    {Fn}
  368.   UserStyle0    :String[20];    {Niether}
  369.   PercentFn     :String[2];     {Function Number}
  370.   PercentSubFn  :String[2];     {Sub Function Number}
  371.   OtherCode     :String[9];     {Code after the Interrupt Number}
  372.  
  373. Procedure UserModify(Var S:String);
  374.  
  375. Var
  376.   y, z  :Byte;
  377.   c     :Byte;
  378.   Style :String[20];
  379.  
  380. Begin
  381.   If (PercentFn<>'  ') And (PercentSubFn<>'  ') Then
  382.     Style:=UserStyle2
  383.   Else
  384.   If PercentFn<>'  ' Then
  385.     Style:=UserStyle1
  386.   Else
  387.     Style:=UserStyle0;
  388.  
  389.   y:=Pos('%f',Style);
  390.   z:=Pos('%s',Style);
  391.   c:=Pos('%c',Style);
  392.  
  393.   If (y>0) Then
  394.   Begin
  395.     Delete(Style,y,2);
  396.     Insert(PercentFn,Style,y);
  397.   End;
  398.  
  399.   If (z>0) Then
  400.   Begin
  401.     Delete(Style,z,2);
  402.     Insert(PercentSubFn,Style,z);
  403.   End;
  404.  
  405.   If (c>0) Then
  406.   Begin
  407.     Delete(Style,c,2);
  408.     Insert(OtherCode,Style,c);
  409.   End;
  410.  
  411.   S:=S+Style;
  412. End;
  413.  
  414. Const
  415.   TabSize       = 4;
  416.   ConvertFile   = 'CONVERT.TXT';
  417.   MainRBFile    = 'RBINT';
  418.   BatchFile     = 'CRB.BAT';
  419.   NGC           = 'CALL NGC';
  420.   NGML          = 'CALL NGML';
  421.  
  422. Var
  423.   IntCount      :Word;
  424.   Cnt           :LongInt;
  425.   CodeLetter,
  426.   C             :Char;
  427.   TempLine,
  428.   LastIntComment,
  429.   IntComment    :String;
  430.   RBDir         :String;
  431.   OutDir        :String;
  432.   NewNumber     :Boolean;
  433.   IntLetter     :Char;
  434.   IntListFile,
  435.   FName         :String[12];
  436.   LongCount     :Word;
  437.   CList         :ConvertType;
  438.   StopProc      :Boolean;
  439.  
  440. Procedure CapWords(StIn:String;Var StOut:String);
  441.  
  442. Var
  443.   X      :Word;
  444.   SpPos  :Byte;
  445.  
  446. Begin
  447.   PasStr.CapWords(StIn,StOut);
  448.   X:=1;
  449.   While CList[X].IfThis<>'' do
  450.   Begin
  451.     SpPos:=Pos(CList[X].IfThis,StOut);
  452.     If SpPos>0 Then
  453.     Begin
  454.       Delete(StOut,SpPos,Length(CList[X].IfThis));
  455.       Insert(CList[X].ThenThis,StOut,SpPos);
  456.     End;
  457.     Inc(X);
  458.   End;
  459. End;
  460.  
  461. Var
  462.   LastWasBlank  :Boolean;       {For CMOS Convert}
  463.  
  464. Begin
  465.   PercentFn:='  ';
  466.   PercentSubFn:='  ';
  467.   SeeAlsoLine:='';
  468.  
  469.   RBDir:='';
  470.   OutDir:='';
  471.   StopProc:=False;
  472.   IntLetter:='A';
  473.  
  474.   ClrScr;
  475.   WriteLn('Ralf Brown''s Text Format to .NG Source Format               Version  1.16');
  476.   WriteLn('Copyright (c) Michael Gallias, 1995');
  477.   WriteLn;
  478.   WriteLn('Note that this program does NOT convert directly to .NG format, it converts');
  479.   WriteLn('the files to a new text format so that they can be compiled with the Norton');
  480.   WriteLn('Guides Compiler.  You thus require the Norton Guides Compiler to convert the');
  481.   WriteLn('files.  If you do not have this program, Ralf''s list is available in .NG');
  482.   WriteLn('format already.  It should be at the same FTP site where you obtained this');
  483.   WriteLn('file.');
  484.   WriteLn;
  485.   WriteLn('Also note that the process requires 16 megabytes of free disk space.');
  486.   WriteLn('The program will run about 10 times faster if you use the SmartDrv write cache.');
  487.   WriteLn('For further details, please see the documentation.');
  488.   WriteLn;
  489.   WriteLn('If you don''t want GLOSSARY.LST, PORTS.LST, 86BUGS.LST, CMOS.LST and MEMORY.LST');
  490.   WriteLn('included, delete them before running this program and they will not be included');
  491.   WriteLn('in the .NG file.');
  492.   WriteLn;
  493.   WriteLn('Copy your CONVERT.TXT file to the directory with the INTERUPT.? files.');
  494.   WriteLn;
  495.   WriteLn('* This program has only been tested on release 46, but it might work on other');
  496.   WriteLn('  releases too.  If you find this program useful, please send me a postcard.');
  497.   WriteLn;
  498.   Write('Do you want to continue  (Y)es (N)o  ?');
  499.   C:=UpCase(ReadKey);
  500.   If C<>'Y' Then Halt;
  501.   ClrScr;
  502.  
  503.   WriteLn('Specify the directory where this program and the original text files');
  504.   WriteLn('are to be found.');
  505.   WriteLn;
  506.   EditString(1,WhereY,60,True,RBDir);
  507.   If Length(RBDir)>2 Then
  508.     If RBDir[Length(RBDir)]<>'\' Then RBDir:=RBDir+'\';
  509.   WriteLn;
  510.   WriteLn;
  511.   WriteLn;
  512.   WriteLn('Specify the output directory for the new text files which need compiling.');
  513.   WriteLn;
  514.   EditString(1,WhereY,60,True,OutDir);
  515.   If Length(OutDir)>2 Then
  516.     If OutDir[Length(OutDir)]<>'\' Then OutDir:=OutDir+'\';
  517.   ClrScr;
  518.   WriteLn('Select a style for the headings:');
  519.   WriteLn;
  520.   WriteLn('  xx is the Interrpt Number, yy the Function Number, zz is the Subfunction');
  521.   WriteLn('  Number and cc are the code letters found after the Interrupt Number in');
  522.   WriteLn('  Ralf''s List.  Format 2 is how it appears in Ralf''s List.');
  523.   WriteLn;
  524.   WriteLn('  1. Int xx Description');
  525.   WriteLn('  2. Int xx cc - Description');
  526.   WriteLn('  3. Int xx Fn yyzz cc - Description');
  527.   WriteLn('  4. Int xx, yyzz (cc) - Description');
  528.   WriteLn('  5. Int xxyyzz cc - Description');
  529.   WriteLn;
  530.   WriteLn('  U. User defined style');
  531.   WriteLn;
  532.   Repeat
  533.     C:=UpCase(ReadKey);
  534.   Until C in ['1','2','3','4','5','U'];
  535.   If C<>'U' Then
  536.     Case C Of
  537.       '2': Begin
  538.              UserStyle2:=' %c -';
  539.              UserStyle1:=' %c -';
  540.              UserStyle0:=' %c -';
  541.            End;
  542.       '3': Begin
  543.              UserStyle2:=' Fn %f%s %c -';
  544.              UserStyle1:=' Fn %f %c -';
  545.              UserStyle0:=' %c -';
  546.            End;
  547.       '4': Begin
  548.              UserStyle2:=', %f%s (%c) -';
  549.              UserStyle1:=', %f (%c) -';
  550.              UserStyle0:=' (%c) -';
  551.            End;
  552.       '5': Begin
  553.              UserStyle2:='%f%s %c -';
  554.              UserStyle1:='%f %c -';
  555.              UserStyle0:=' %c -';
  556.            End;
  557.       Else
  558.            Begin
  559.              UserStyle2:='';
  560.              UserStyle1:='';
  561.              UserStyle0:='';
  562.            End;
  563.     End
  564.   Else
  565.   Begin
  566.     ClrScr;
  567.     WriteLn('Examples (don''t type the quotes):');
  568.     WriteLn;
  569.     WriteLn('  Int xx Description                       ""');
  570.     WriteLn('  Int xx - Description                     " -"');
  571.     WriteLn('  Int xx Fn yyzz cc - Description          " Fn %f%s %c -"');
  572.     WriteLn('  Int xx, yyzz (cc) - Description          ", %f%s (%c) -"');
  573.     WriteLn('  Int xx, Fn yy, SubFn zz -> Description   "Fn %f, SubFn %s ->"');
  574.     WriteLn;
  575.     WriteLn('Type in the style you would like, %f is the Function number, %s is the');
  576.     WriteLn('Subfunction number.  What you type will be appended to the Int xx and');
  577.     WriteLn('then a space followed by the description will follow it.');
  578.     WriteLn;
  579.     WriteLn('Note that when you type the %f and %s, they must be lower case!');
  580.     WriteLn;
  581.     WriteLn('Assuming a function and subfunction number do exist, enter the format:');
  582.     WriteLn;
  583.     Write('Int xx');
  584.     EditString(WhereX,WhereY,18,False,UserStyle2);
  585.     WriteLn;
  586.     WriteLn;
  587.     WriteLn('Assuming a function number do exists, but no subfunction, enter the format:');
  588.     WriteLn;
  589.     Write('Int xx');
  590.     EditString(WhereX,WhereY,18,False,UserStyle1);
  591.     WriteLn;
  592.     WriteLn;
  593.     WriteLn('Assuming no function and subfunction numbers exist, enter the format:');
  594.     WriteLn;
  595.     Write('Int xx');
  596.     EditString(WhereX,WhereY,18,False,UserStyle0);
  597.   End;
  598.   ClrScr;
  599.   WriteLn;
  600.   WriteLn;
  601.   WriteLn;
  602.   WriteLn;
  603.   WriteLn('Press any key to start the process or [Esc] to quit to DOS.');
  604.   C:=ReadKey;
  605.   If C=#27 Then Halt;
  606.   ClrScr;
  607.   WriteLn('Converting Ralf''s list:');
  608.   WriteLn;
  609.  
  610.   LoadConvertList(RBDir+ConvertFile,CList);
  611.  
  612.   Assign(MenuLink,OutDir+MainRBFile);
  613.   Rewrite(MenuLink);
  614.   WriteLn(MenuLink,'!Name: Ralf Brown');
  615.   WriteLn(MenuLink,'!Credits: Ralf Brown''s Interrupt List Converted by Michael Gallias');
  616.   WriteLn(MenuLink,'!Menu: Lists');
  617.  
  618.   Assign(BatchJob,OutDir+BatchFile);
  619.   Rewrite(BatchJob);
  620.   WriteLn(BatchJob,'@Echo Off');
  621.  
  622.   Assign(F,RBDir+'INTERRUP.'+IntLetter);
  623.   Reset(F);
  624.  
  625.   FName:=NextOutputFileName;
  626.   NewBatchItem(NGC+' '+FName);
  627.   NewMenuItem('Comments',FName);
  628.   Assign(G,OutDir+FName);
  629.   Rewrite(G);
  630.  
  631.   O('!Short: Credits');
  632.   OLn;
  633.   O('^UCredits^U');
  634.   OLn;
  635.   Repeat
  636.     I(L);
  637.     If Copy(L,1,5)<>'-----' Then O(L);
  638.   Until Copy(L,1,5)='-----';
  639.   OLn;
  640.   O('This list was converted from the released text format to the');
  641.   O('Norton Guides / Expert Help Popup format by Michael Gallias.');
  642.   OLn;
  643.   O('Michael Gallias');
  644.   O('P O Box 51231');
  645.   O('Musgrave Road');
  646.   O('4062');
  647.   O('South Africa');
  648.   OLn;
  649.   O('gallias@iafrica.com');
  650.   OLn;
  651.  
  652.   Cnt:=1;
  653.   Repeat
  654.     Str(Cnt,L);
  655.     L:='Ralf''s Comment '+L;
  656.     O('!Short: '+L);
  657.     OLn;
  658.     O('^U'+L+'^U');
  659.     OLn;
  660.     Repeat
  661.       I(L);
  662.       If Copy(L,1,5)<>'-----' Then O(L);
  663.     Until Copy(L,1,5)='-----';
  664.     OLn;
  665.     Inc(Cnt);
  666.     CodeLetter:=L[9];
  667.     Delete(L,1,10);
  668.   Until L='00---------------------------------';
  669.  
  670.   Close(G);
  671.  
  672.   FName:=NextOutputFileName;
  673.   NewMenuItem('Interrupts',FName);
  674.   IntListFile:=FName;
  675.   Assign(G,OutDir+IntListFile);
  676.   Rewrite(G);
  677.   OLn;
  678.   NewBatchItem(NGC+' '+IntListFile);
  679.   WriteLn;
  680.  
  681.   Cnt:=1;
  682.   IntCount:=1;
  683.   Repeat
  684.     I(L);
  685.     If Copy(L,1,3)='INT' Then
  686.     Begin
  687.       TempLine:=Copy(L,1,6);            {INT xx}
  688.       TempLine[2]:='n';
  689.       TempLine[3]:='t';                 {Int xx}
  690.       Delete(L,1,6);                    {Delete 'INT xx' Part From L}
  691.       OtherCode:=Copy(L,1,Pos('-',L));  {Get Code Letters and the '-'}
  692.       Delete(L,1,Length(OtherCode));    {Get the int. description into L}
  693.       Delete(OtherCode,Length(OtherCode)-1,2);  {Get rid of the ' -'}
  694.       LowerCase(L,L);
  695.       CapWords(L,L);                    {Set Caps Nicely}
  696.       UserModify(TempLine);             {Append user Fn and SubFn style}
  697.       L:=TempLine+L;                    {Append description}
  698.     End
  699.     Else
  700.     Begin
  701.       LowerCase(L,L);
  702.       CapWords(L,L);
  703.     End;
  704.  
  705.     CheckIntNumber(L,NewNumber,IntComment,IntCount);
  706.  
  707.     If (NewNumber) And (IntComment<>'$$NO$$') Then
  708.     Begin
  709.       LastIntComment:=IntComment;
  710.       Close(G);
  711.       Assign(G,OutDir+IntListFile);
  712.       Append(G);
  713.       FName:=NextOutputFileName;
  714.       O('!Short: '+IntComment);
  715.       O('!File:'+NGOFName(FName));
  716.       OLn;
  717.       Close(G);
  718.       NewBatchItem(NGC+' '+FName);
  719.       Assign(G,OutDir+FName);
  720.       Rewrite(G);
  721.     End;
  722.  
  723.     If IntCount>200 Then
  724.     Begin
  725.       IntCount:=1;
  726.       Close(G);
  727.       Assign(G,OutDir+IntListFile);
  728.       Append(G);
  729.       FName:=NextOutputFileName;
  730.       O('!Short: '+LastIntComment+'  ^B(Cont.)^B');
  731.       O('!File:'+NGOFName(FName));
  732.       OLn;
  733.       Close(G);
  734.       NewBatchItem(NGC+' '+FName);
  735.       Assign(G,OutDir+FName);
  736.       Rewrite(G);
  737.     End;
  738.  
  739.     GotoXY(1,WhereY-1);
  740.     Write('                                                                               ');
  741.     GotoXY(1,WhereY);
  742.     WriteLn(Cnt,' ',Copy(L,1,60));
  743.     O('!Short: '+Copy(L,1,76));
  744.     OLn;
  745.     If Copy(L,1,3)='Int' Then
  746.     Begin
  747.       TempLine:=Copy(L,1,73);
  748.       FormatVar(TempLine,TempLine,73,LeftText);
  749.       TempLine:='^U'+TempLine+'^U  [^B'+CodeLetter+'^B]';
  750.     End
  751.     Else
  752.       TempLine:='^U'+Copy(L,1,76)+'^U';
  753.     O(TempLine);
  754.     OLn;
  755.     IntComment:=L;
  756.     LongCount:=0;
  757.     Repeat
  758.       I(L);
  759.       BoldEtc(L,L);
  760.       TabTo(L,L,TabSize);
  761.       Inc(LongCount,Length(L));
  762.  
  763.       If (LongCount>11500) And (Copy(L,1,5)<>'-----') Then
  764.       Begin
  765.         Inc(IntCount);
  766.         LongCount:=0;
  767.         OLn;
  768.         O('^B.NG limit reached, continued in next section...^B');
  769.         OLn;
  770.         O('!Short: '+IntComment+'  ^B(Cont.)^B');
  771.         OLn;
  772.         O('^U'+IntComment+'  ^B(Cont.)^B');
  773.         OLn;
  774.       End;
  775.  
  776.       If Copy(L,1,5)<>'-----' Then
  777.         O(L);
  778.  
  779.     Until (Copy(L,1,5)='-----') Or (EOF(F));
  780.     CodeLetter:=L[9];
  781.     PercentFn:=Copy(L,13,2);
  782.     PercentSubFn:=Copy(L,15,2);
  783.     If PercentFn='--' Then PercentFn:='  ';
  784.     If PercentSubFn='--' Then PercentSubFn:='  ';
  785.     OLn;
  786.     Inc(Cnt);
  787.  
  788.     If EOF(F) Then
  789.     Begin
  790.       Close(F);
  791.       IntLetter:=Chr(Ord(IntLetter)+1);
  792.       Assign(F,RBDir+'INTERRUP.'+IntLetter);
  793.       Reset(F);
  794.       If IOResult=0 Then
  795.       Begin
  796.         ReadLn(F);
  797.         ReadLn(F);
  798.         ReadLn(F);
  799.       End
  800.       Else
  801.         StopProc:=True;
  802.     End;
  803.  
  804.   Until StopProc;
  805.  
  806.   Close(G);
  807.  
  808.   {End Interrupts}
  809.  
  810.   {Check For Glossary}
  811.  
  812.   Assign(F,RBDir+'GLOSSARY.LST');
  813.   Reset(F);
  814.   If IOResult=0 Then
  815.   Begin
  816.     I(L);
  817.     I(L);
  818.     I(L);
  819.     I(L);
  820.     Cnt:=1;
  821.     FName:=NextOutputFileName;
  822.     NewMenuItem('Glossary',FName);
  823.     IntListFile:=FName;
  824.     Assign(G,OutDir+IntListFile);
  825.     Rewrite(G);
  826.     OLn;
  827.     NewBatchItem(NGC+' '+IntListFile);
  828.  
  829.     Repeat
  830.       GotoXY(1,WhereY-1);
  831.       Write('                                                                               ');
  832.       GotoXY(1,WhereY);
  833.       WriteLn(Cnt,' ',Copy(L,1,60));
  834.       O('!Short: '+Copy(L,1,76));
  835.       OLn;
  836.       TempLine:='^U'+Copy(L,1,76)+'^U';
  837.       O(TempLine);
  838.       OLn;
  839.       Repeat
  840.         I(L);
  841.         BoldEtc(L,L);
  842.         TabTo(L,L,TabSize);
  843.         If L<>'' Then O(L);
  844.       Until (L='') Or (EOF(F));
  845.       OLn;
  846.       If Not EOF(F) Then I(L);
  847.       Inc(Cnt);
  848.     Until EOF(F);
  849.  
  850.     Close(F);
  851.     Close(G);
  852.   End;
  853.  
  854.   {End Check For Glossary}
  855.  
  856.   {Check For Low Memory}
  857.  
  858.   Assign(F,RBDir+'MEMORY.LST');
  859.   Reset(F);
  860.   If IOResult=0 Then
  861.   Begin
  862.     I(L);
  863.     I(L);
  864.     I(L);
  865.     I(L);
  866.     Cnt:=1;
  867.     FName:=NextOutputFileName;
  868.     NewMenuItem('Memory',FName);
  869.     IntListFile:=FName;
  870.     Assign(G,OutDir+IntListFile);
  871.     Rewrite(G);
  872.     OLn;
  873.     NewBatchItem(NGC+' '+IntListFile);
  874.  
  875.     Repeat
  876.       GotoXY(1,WhereY-1);
  877.       Write('                                                                               ');
  878.       GotoXY(1,WhereY);
  879.       If (L[Length(L)]=':') Then Delete(L,Length(L),1);
  880.       WriteLn(Cnt,' ',Copy(L,1,60));
  881.       O('!Short: '+Copy(L,1,76));
  882.       LastIntComment:=Copy(L,1,68);
  883.       OLn;
  884.       TempLine:='^U'+Copy(L,1,76)+'^U';
  885.       O(TempLine);
  886.       OLn;
  887.       I(L);
  888.       IntCount:=1;
  889.       Repeat
  890.         BoldEtc(L,L);
  891.         If L<>'' Then O(L);
  892.         If Not EOF(F) Then I(L);
  893.         TabTo(L,L,TabSize);
  894.  
  895.         {Check for >12kb entries}
  896.  
  897.         Inc(IntCount);
  898.         If IntCount>200 Then
  899.         Begin
  900.           O('!Short: '+LastIntComment+'  ^B(Cont.)^B');
  901.           OLn;
  902.           TempLine:='^U'+LastIntComment+'  ^B(Cont.)^B';
  903.           O(TempLine);
  904.           OLn;
  905.           IntCount:=1;
  906.         End;
  907.  
  908.       Until (Copy(L,1,9)='Format of') Or (EOF(F));
  909.       OLn;
  910.       Inc(Cnt);
  911.     Until EOF(F);
  912.  
  913.     Close(F);
  914.     Close(G);
  915.   End;
  916.  
  917.   {End Check For Low Memory}
  918.  
  919.   {Check For Ports}
  920.  
  921.   Assign(F,RBDir+'PORTS.LST');
  922.   Reset(F);
  923.   If IOResult=0 Then
  924.   Begin
  925.     Cnt:=1;
  926.     FName:=NextOutputFileName;
  927.     NewMenuItem('Ports',FName);
  928.     IntListFile:=FName;
  929.     Assign(G,OutDir+IntListFile);
  930.     Rewrite(G);
  931.     OLn;
  932.     NewBatchItem(NGC+' '+IntListFile);
  933.  
  934.     Repeat
  935.  
  936.       If Cnt>200 Then   {File too long for one NGO file}
  937.       Begin
  938.         Cnt:=1;
  939.         FName:=NextOutputFileName;
  940.         NewMenuItem('More Ports',FName);
  941.         IntListFile:=FName;
  942.         Close(G);
  943.         Assign(G,OutDir+IntListFile);
  944.         Rewrite(G);
  945.         OLn;
  946.         NewBatchItem(NGC+' '+IntListFile);
  947.       End;
  948.  
  949.       Repeat
  950.         I(L)
  951.       Until L<>'';
  952.  
  953.       TabTo(L,L,TabSize);
  954.       GotoXY(1,WhereY-1);
  955.       Write('                                                                               ');
  956.       GotoXY(1,WhereY);
  957.       WriteLn(Cnt,' ',Copy(L,1,60));
  958.       O('!Short: '+Copy(L,1,76));
  959.       OLn;
  960.       TempLine:='^U'+Copy(L,1,76)+'^U';
  961.       O(TempLine);
  962.       OLn;
  963.       I(L);
  964.       Repeat
  965.         BoldEtc(L,L);
  966.         If Copy(L,1,9)<>'---------' Then O(L);
  967.         If Not EOF(F) Then I(L);
  968.         TabTo(L,L,TabSize);
  969.       Until (Copy(L,1,9)='---------') Or (EOF(F));
  970.       OLn;
  971.       Inc(Cnt);
  972.     Until EOF(F);
  973.  
  974.     Close(F);
  975.     Close(G);
  976.   End;
  977.  
  978.   {End Check For Ports}
  979.  
  980.   {Check For CMOS}
  981.  
  982.   Assign(F,RBDir+'CMOS.LST');
  983.   Reset(F);
  984.   If IOResult=0 Then
  985.   Begin
  986.     Cnt:=1;
  987.     FName:=NextOutputFileName;
  988.     NewMenuItem('CMOS',FName);
  989.     IntListFile:=FName;
  990.     Assign(G,OutDir+IntListFile);
  991.     Rewrite(G);
  992.     OLn;
  993.     NewBatchItem(NGC+' '+IntListFile);
  994.  
  995.     I(L);
  996.     While (L='') And Not EOF(F) do
  997.       I(L);
  998.  
  999.     TabTo(L,L,TabSize);
  1000.     UnPadVar(L,L);
  1001.     Repeat
  1002.       GotoXY(1,WhereY-1);
  1003.       Write('                                                                               ');
  1004.       GotoXY(1,WhereY);
  1005.       WriteLn(Cnt,' ',Copy(L,1,60));
  1006.       O('!Short: '+Copy(L,1,76));
  1007.       LastIntComment:=Copy(L,1,68);
  1008.       OLn;
  1009.       TempLine:='^U'+Copy(L,1,76)+'^U';
  1010.       O(TempLine);
  1011.       OLn;
  1012.       If L='' Then LastWasBlank:=True Else LastWasBlank:=False;
  1013.       I(L);
  1014.       IntCount:=0;
  1015.       Repeat
  1016.         Inc(IntCount);
  1017.         If (IntCount>250) And LastWasBlank And (Copy(L,1,7)<>'       ') Then
  1018.         Begin
  1019.           O('!Short: '+LastIntComment+'  ^B(Cont.)^B');
  1020.           OLn;
  1021.           TempLine:='^U'+LastIntComment+'  ^B(Cont.)^B';
  1022.           O(TempLine);
  1023.           OLn;
  1024.           IntCount:=1;
  1025.         End;
  1026.  
  1027.         BoldEtc(L,L);
  1028.         If Not ((Copy(L,1,7)='       ') And (LastWasBlank)) Then O(L);
  1029.         If L='' Then LastWasBlank:=True Else LastWasBlank:=False;
  1030.         If (Not EOF(F)) And (Not ((Copy(L,1,7)='      ') And (LastWasBlank))) Then I(L);
  1031.         TabTo(L,L,TabSize);
  1032.       Until ((Copy(L,1,7)='       ') And (LastWasBlank)) Or (EOF(F));
  1033.       If Not EOF(F) Then UnPadVar(L,L);
  1034.       OLn;
  1035.       Inc(Cnt);
  1036.     Until EOF(F);
  1037.  
  1038.     Close(F);
  1039.     Close(G);
  1040.   End;
  1041.  
  1042.   {End Check For CMOS}
  1043.  
  1044.   {Check For 86BUGS}
  1045.  
  1046.   Assign(F,RBDir+'86BUGS.LST');
  1047.   Reset(F);
  1048.   If IOResult=0 Then
  1049.   Begin
  1050.     Cnt:=1;
  1051.     FName:=NextOutputFileName;
  1052.     NewMenuItem('86 Bugs',FName);
  1053.     IntListFile:=FName;
  1054.     Assign(G,OutDir+IntListFile);
  1055.     Rewrite(G);
  1056.     OLn;
  1057.     NewBatchItem(NGC+' '+IntListFile);
  1058.  
  1059.     I(L);
  1060.     Repeat
  1061.       While (L='') And Not EOF(F) do
  1062.         I(L);
  1063.  
  1064.       GotoXY(1,WhereY-1);
  1065.       Write('                                                                               ');
  1066.       GotoXY(1,WhereY);
  1067.       WriteLn(Cnt,' ',Copy(L,1,60));
  1068.       O('!Short: '+Copy(L,1,76));
  1069.       OLn;
  1070.       TempLine:='^U'+Copy(L,1,76)+'^U';
  1071.       O(TempLine);
  1072.       OLn;
  1073.       I(L);
  1074.       Repeat
  1075.         BoldEtc(L,L);
  1076.         If Pos(':',Copy(L,1,9))=0 Then O(L);
  1077.         If Not EOF(F) Then I(L);
  1078.         TabTo(L,L,TabSize);
  1079.       Until (Pos(':',Copy(L,1,9))>0) Or (EOF(F));
  1080.       OLn;
  1081.       Inc(Cnt);
  1082.     Until EOF(F);
  1083.  
  1084.     Close(F);
  1085.     Close(G);
  1086.   End;
  1087.  
  1088.   {End Check For 86BUGS}
  1089.  
  1090.  
  1091.   NewBatchItem(NGML+' '+MainRBFile);
  1092.  
  1093.   Close(MenuLink);
  1094.   Close(BatchJob);
  1095.  
  1096.   ClrScr;
  1097.   WriteLn('Complete.');
  1098.   WriteLn;
  1099.   WriteLn('Now, go to the output directory and type CRB to compile the database.');
  1100.   WriteLn('The database will be around 4 megabytes when complete.');
  1101.   WriteLn;
  1102.   WriteLn('Make sure the NGC (Norton Guides Compiler) and the NGML (Norton Guides');
  1103.   WriteLn('Menu Linker) programs are on the path (or setup a batch file).');
  1104.   WriteLn;
  1105. End.
  1106.